/**
//给定一个 N 叉树，返回其节点值的 后序遍历 。 
//
// N 叉树 在输入中按层序遍历进行序列化表示，每组子节点由空值 null 分隔（请参见示例）。 
//
// 
// 
// 
//
// 进阶： 
//
// 递归法很简单，你可以使用迭代法完成此题吗? 
//
// 
//
// 示例 1： 
//
// 
//
// 
//输入：root = [1,null,3,2,4,null,5,6]
//输出：[5,6,3,2,4,1]
// 
//
// 示例 2： 
//
// 
//
// 
//输入：root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,
//null,13,null,null,14]
//输出：[2,6,14,11,7,3,12,8,4,13,9,10,5,1]
// 
//
// 
//
// 提示： 
//
// 
// N 叉树的高度小于或等于 1000 
// 节点总数在范围 [0, 10^4] 内 
// 
// 
// 
// Related Topics 栈 树 深度优先搜索 👍 165 👎 0

*/

package com.xixi.dataStructure.tree.binaryTree;

import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

public class ID00590NAryTreePostorderTraversal {
public static void main(String[] args) {
Solution solution = new ID00590NAryTreePostorderTraversal().new Solution();
}

    class Node {
        public int val;
        public List<Node> children;

        public Node() {}

        public Node(int _val) {
            val = _val;
        }

        public Node(int _val, List<Node> _children) {
            val = _val;
            children = _children;
        }
    };

//leetcode submit region begin(Prohibit modification and deletion)
/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {



    public List<Integer> postorder(Node root) {
        List<Integer> resultList = new LinkedList<>();
        Stack<Node> stack = new Stack<>();
        if(root == null){
            return resultList;
        }

        stack.push(root); //根节点入栈底部，因为最后打印根节点

        while(!stack.isEmpty()){
            Node parNode = stack.peek();
            if(parNode.children == null){
                stack.pop();//弹出这个节点，然后打印它
                resultList.add(parNode.val); //如果当前节点没有子节点，说明应该打印当前节点
                continue;
            }
            for(int i = parNode.children.size() -1 ; i >=0; --i){//如果有子节点，从左到右遍历子节点,所以先把最右节点放到栈底
                stack.push(parNode.children.get(i));
            }
            //等这个节点遍历完就可以打个标签说明它可以被打印了，只不过放在栈里等着排队
            //!!这样会破坏树，得想个办法不破坏树
                parNode.children = null;

        }



        return resultList;
    }
}
//leetcode submit region end(Prohibit modification and deletion)




}